package com.ruoyi.resume.service.impl;

import com.ruoyi.resume.domain.model.ResumeAnalysis;
import com.ruoyi.resume.mapper.ResumeAnalysisMapper;
import com.ruoyi.resume.service.AsyncAnalysisResumeService;
import com.ruoyi.resume.utils.deepseek.DeepSeekV3Client;
import com.ruoyi.resume.utils.zhipu.Glm;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;

@Service
public class AsyncAnalysisResumeServiceImpl implements AsyncAnalysisResumeService {

    private static final Logger logger = LoggerFactory.getLogger(AsyncAnalysisResumeServiceImpl.class);

    @Autowired
    private ResumeAnalysisMapper resumeAnalysisMapper;

    @Async("customThreadPoolTaskExecutor")
    @Override
    public void analysisUseAi(String text, Integer resumeId) {
        // 检查是否有 AI 评价
        logger.info("检查简历 ID 是否已有 AI 评价：" + resumeId);
        boolean hasExistingAnalysis = resumeAnalysisMapper.existsResumeAnalysisByResumeId(resumeId);

        // 如果有评价，删除已有的 AI 评价
        if (hasExistingAnalysis) {
            logger.info("删除已有的 AI 评价，简历 ID：" + resumeId);
            resumeAnalysisMapper.deleteResumeAnalysisByResumeId(resumeId);
        } else {
            logger.info("简历 ID：" + resumeId + " 没有已有的 AI 评价，无需删除");
        }

        // 构造提示词
        String prompt = "请你扮演一位专业面试官，根据候选人的简历，分析并完成以下任务：\n" +
                "1. 总结该候选人的主要优点和缺点，具体化地分析其技能、经验及适配度。\n" +
                "2. 根据简历内容，提出三个与职位相关的具体面试问题。\n" +
                "3. 请对简历的各个方面做综合评价。\n" +
                "请严格按照以下格式返回分析结果：\n\n" +
                "【优点和缺点分析】\n" +
                "优点：\n" +
                "1. （优点1）\n" +
                "2. （优点2）\n" +
                "3. （优点3）\n" +
                "缺点：\n" +
                "1. （缺点1）\n" +
                "2. （缺点2）\n" +
                "3. （缺点3）\n\n" +
                "【面试问题】\n" +
                "1. （问题一）\n" +
                "2. （问题二）\n" +
                "3. （问题三）\n\n" +
                "【综合评价】\n" +
                "（在这里详细分析候选人的综合评价）\n" +
                "简历内容：\n" +
                text;

        // 调用大语言模型
        String result = Glm.chatGLM4(prompt);
        logger.info("简历智能分析结果：\n" + result);

        // 解析返回的结果
        ResumeAnalysis analysis = parseAnalysisResult(result);

        analysis.setResumeId(resumeId);

        // 存储到数据库
        resumeAnalysisMapper.insertResumeAnalysis(analysis);
    }


    /**
     * 解析大语言模型返回的结果
     * @param result AI返回的分析结果
     * @return ResumeAnalysis 实体
     */
    private ResumeAnalysis parseAnalysisResult(String result) {
        ResumeAnalysis analysis = new ResumeAnalysis();

        try {
            // 按照"【" 分割不同的模块
            String[] sections = result.split("【");
            for (String section : sections) {
                if (section.startsWith("优点和缺点分析】")) {
                    parseStrengthsAndWeaknesses(analysis, section);
                } else if (section.startsWith("面试问题】")) {
                    parseInterviewQuestions(analysis, section);
                } else if (section.startsWith("综合评价】")) {
                    String authenticityEvaluation = section.replace("综合评价】", "").trim();
                    logger.info("解析后的综合评价内容：{}", authenticityEvaluation);
                    analysis.setOverallEvaluation(authenticityEvaluation); // 存入ResumeAnalysis对象
                }
            }
        } catch (Exception e) {
            logger.error("解析AI返回结果失败：", e);
        }

        return analysis;
    }


    private void parseStrengthsAndWeaknesses(ResumeAnalysis analysis, String section) {
        try {
            // 使用优点和缺点的关键字进行进一步拆分
            String[] parts = section.split("优点：|缺点：");

            // 解析优点部分
            if (parts.length > 1) {
                String[] strengths = parts[1].split("\\d\\. "); // 根据编号分割优点
                analysis.setStrength1(strengths.length > 1 ? strengths[1].replace("**", "").trim() : null);
                analysis.setStrength2(strengths.length > 2 ? strengths[2].replace("**", "").trim() : null);
                analysis.setStrength3(strengths.length > 3 ? strengths[3].replace("**", "").trim() : null);
            }

            // 解析缺点部分
            if (parts.length > 2) {
                String[] weaknesses = parts[2].split("\\d\\. "); // 根据编号分割缺点
                analysis.setWeakness1(weaknesses.length > 1 ? weaknesses[1].replace("**", "").trim() : null);
                analysis.setWeakness2(weaknesses.length > 2 ? weaknesses[2].replace("**", "").trim() : null);
                analysis.setWeakness3(weaknesses.length > 3 ? weaknesses[3].replace("**", "").trim() : null);
            }
        } catch (Exception e) {
            logger.error("解析优点和缺点失败：", e);
        }
    }

    private void parseInterviewQuestions(ResumeAnalysis analysis, String section) {
        try {
            // 根据编号拆分面试问题
            String[] questions = section.split("\\d\\. ");
            analysis.setQuestion1(questions.length > 1 ? questions[1].trim() : null);
            analysis.setQuestion2(questions.length > 2 ? questions[2].trim() : null);
            analysis.setQuestion3(questions.length > 3 ? questions[3].trim() : null);
        } catch (Exception e) {
            logger.error("解析面试问题失败：", e);
        }
    }

}
